{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 37,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 38,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [],
   "source": [
    "plt.style.use('ggplot')\n",
    "plt.rcParams['axes.facecolor']='w'\n",
    "plt.rcParams['axes.edgecolor'] = '#D6D6D6'\n",
    "plt.rcParams['axes.linewidth'] = 2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "$$\n",
    "\\newcommand\\bs[1]{\\boldsymbol{#1}}\n",
    "$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 39,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "<style>\n",
       ".pquote {\n",
       "  text-align: left;\n",
       "  margin: 40px 0 40px auto;\n",
       "  width: 70%;\n",
       "  font-size: 1.5em;\n",
       "  font-style: italic;\n",
       "  display: block;\n",
       "  line-height: 1.3em;\n",
       "  color: #5a75a7;\n",
       "  font-weight: 600;\n",
       "  border-left: 5px solid rgba(90, 117, 167, .1);\n",
       "  padding-left: 6px;\n",
       "}\n",
       ".notes {\n",
       "  font-style: italic;\n",
       "  display: block;\n",
       "  margin: 40px 10%;\n",
       "}\n",
       "img + em {\n",
       "  text-align: center;\n",
       "  display: block;\n",
       "  color: gray;\n",
       "  font-size: 0.9em;\n",
       "  font-weight: 600;\n",
       "}\n",
       "</style>\n"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "%%html\n",
    "<style>\n",
    ".pquote {\n",
    "  text-align: left;\n",
    "  margin: 40px 0 40px auto;\n",
    "  width: 70%;\n",
    "  font-size: 1.5em;\n",
    "  font-style: italic;\n",
    "  display: block;\n",
    "  line-height: 1.3em;\n",
    "  color: #5a75a7;\n",
    "  font-weight: 600;\n",
    "  border-left: 5px solid rgba(90, 117, 167, .1);\n",
    "  padding-left: 6px;\n",
    "}\n",
    ".notes {\n",
    "  font-style: italic;\n",
    "  display: block;\n",
    "  margin: 40px 10%;\n",
    "}\n",
    "img + em {\n",
    "  text-align: center;\n",
    "  display: block;\n",
    "  color: gray;\n",
    "  font-size: 0.9em;\n",
    "  font-weight: 600;\n",
    "}\n",
    "</style>"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "# Preprocessing for deep learning: from covariance matrix to image whitening\n",
    "\n",
    "A version of this notebook has been published [here](https://hadrienj.github.io/posts/Preprocessing-for-deep-learning/).\n",
    "\n",
    "The goal of this post/notebook is to go from the basics of data preprocessing to modern techniques used in deep learning. My point is that we can use code (Python/Numpy etc.) to better understand abstract mathematical notions! Thinking by coding! 💥\n",
    "\n",
    "We will start with basic but very useful concepts in data science and machine learning/deep learning like variance and covariance matrix and we will go further to some preprocessing techniques used to feed images into neural networks. We will try to get more concrete insights using code to actually see what each equation is doing!\n",
    "\n",
    "We call preprocessing all transformations on the raw data before it is fed to the machine learning or deep learning algorithm. For instance, training a convolutional neural network on raw images will probably lead to bad classification performances ([Pal & Sudeep, 2016](https://ieeexplore.ieee.org/document/7808140/)). The preprocessing is also important to speed up training (for instance, centering and scaling techniques, see [Lecun et al., 2012; see 4.3](http://yann.lecun.com/exdb/publis/pdf/lecun-98b.pdf)).\n",
    "\n",
    "Here is the syllabus of this tutorial:\n",
    "\n",
    "1. **Background**: In the first part, we will get some reminders about variance and covariance and see how to generate and plot fake data to get a better understanding of these concepts.\n",
    "\n",
    "2. **Preprocessing**: In the second part, we will see the basics of some preprocessing techniques that can be applied to any kind of data: mean normalization, standardisation and whitening.\n",
    "\n",
    "3. **Whitening images**: In the third part, we will use the tools and concepts gained in 1. and 2. to do a special kind of whitening called Zero Component Analysis (ZCA). It can be used to preprocess images for deep learning. This part will be very practical and fun ☃️!\n",
    "\n",
    "Feel free to fork the notebook. For instance, check the shapes of the matrices each time you have a doubt :)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "# 1. Background\n",
    "\n",
    "## A. Variance and covariance\n",
    "\n",
    "The variance of a variable describes how much the values are spread. The covariance is a measure that tells the amount of dependency between two variables. A positive covariance means that values of the first variable are large when values of the second variables are also large. A negative covariance means the opposite: large values from one variable are associated with small values of the other. The covariance value depends on the scale of the variable so it is hard to analyse it. It is possible to use the correlation coefficient that is easier to interpret. It is just the covariance normalized.\n",
    "\n",
    "<img src=\"images/negative-and-positive-covariance.png\" width=\"500\" alt=\"Intuition about the covariance between two variables\" title=\"Representation of the covariance between two variables.\">\n",
    "<em>A positive covariance means that large values of one variable are associated with big values from the other (left). A negative covariance means that large values of one variable are associated with small values of the other one (right).</em>\n",
    "\n",
    "The covariance matrix is a matrix that summarizes the variances and covariances of a set of vectors and it can tell a lot of things about your variables. The diagonal corresponds to the variance of each vector:\n",
    "\n",
    "<img src=\"images/covariance1.png\" width=\"400\" alt=\"Variance in the matrix of covariance\" title=\"Variance in the matrix of covariance is on the diagonal\">\n",
    "<em>A matrix $\\bs{A}$ and its matrix of covariance. The diagonal corresponds to the variance of each column vector.</em>\n",
    "\n",
    "Let's just check with the formula of the variance:\n",
    "\n",
    "$$\n",
    "V(\\bs{X}) = \\frac{1}{n}\\sum_{i=1}^{n}(x_i-\\bar{x})^2\n",
    "$$\n",
    "\n",
    "with $n$ the length of the vector, and $\\bar{x}$ the mean of the vector. For instance, the variance of the first column vector of $\\bs{A}$ is:\n",
    "\n",
    "$$\n",
    "V(\\bs{A}_{:,1}) = \\frac{(1-3)^2+(5-3)^2+(3-3)^2}{3} = 2.67\n",
    "$$"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "This is the first cell of our covariance matrix. The second element on the diagonal corresponds of the variance of the second column vector from $\\bs{A}$ and so on.\n",
    "\n",
    "*Note*: the vectors extracted from the matrix $\\bs{A}$ correspond to the columns of $\\bs{A}$.\n",
    "\n",
    "The other cells correspond to the covariance between two column vectors from $\\bs{A}$. For instance, the covariance between the first and the third column is located in the covariance matrix as the column 1 and the row 3 (or the column 3 and the row 1).\n",
    "\n",
    "<img src=\"images/covariance2.png\" width=\"400\" alt=\"Covariance in the matrix of covariance\" title=\"The position in the covariance matrix.\">\n",
    "<em>The position in the covariance matrix. Column corresponds to the first variable and row to the second (or the opposite). The covariance between the first and the third column vector of $\\bs{A}$ is the element in column 1 and row 3 (or the opposite = same value).</em>\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "Let's check that the covariance between the first and the third column vector of $\\bs{A}$ is equal to $-2.67$. The formula of the covariance between two variables $\\bs{X}$ and $\\bs{Y}$ is:\n",
    "\n",
    "$$\n",
    "cov(\\bs{X},\\bs{Y}) = \\frac{1}{n} \\sum_{i=1}^{n}(x_i-\\bar{x})(y_i-\\bar{y})\n",
    "$$\n",
    "\n",
    "The variables $\\bs{X}$ and $\\bs{Y}$ are the first and the third column vectors in the last example. Let's split this formula to be sure that it is crystal clear:\n",
    "\n",
    "1. $(x_1-\\bar{x})$. The sum symbol means that we will iterate on the elements of the vectors. We will start with the first element ($i=1$) and calculate the first element of $\\bs{X}$ minus the mean of the vector $\\bs{X}$.\n",
    "2. $(x_1-\\bar{x})(y_1-\\bar{y})$. Multiply the result with the first element of $\\bs{Y}$ minus the mean of the vector $\\bs{Y}$.\n",
    "3. $\\sum_{i=1}^{n}(x_i-\\bar{x})(y_i-\\bar{y})$. Reiterate the process for each element of the vectors and calculate the sum of all results.\n",
    "4. $\\frac{1}{n} \\sum_{i=1}^{n}(x_i-\\bar{x})(y_i-\\bar{y})$. Divide by the number of elements in the vector.\n",
    "\n",
    "\n",
    "#### Example 1.\n",
    "\n",
    "Let's start with the matrix $\\bs{A}$:\n",
    "\n",
    "$$\n",
    "\\boldsymbol{A}=\n",
    "\\begin{bmatrix}\n",
    "    1 & 3 & 5\\\\\\\\\n",
    "    5 & 4 & 1\\\\\\\\\n",
    "    3 & 8 & 6\n",
    "\\end{bmatrix}\n",
    "$$\n",
    "\n",
    "We will calculate the covariance between the first and the third column vectors:\n",
    "\n",
    "$$\n",
    "\\boldsymbol{X} = \\begin{bmatrix}\n",
    "    1\\\\\\\\\n",
    "    5\\\\\\\\\n",
    "    3\n",
    "\\end{bmatrix}\n",
    "$$\n",
    "\n",
    "and\n",
    "\n",
    "$$\\boldsymbol{Y} = \\begin{bmatrix}\n",
    "    5\\\\\\\\\n",
    "    1\\\\\\\\\n",
    "    6\n",
    "\\end{bmatrix}\n",
    "$$\n",
    "\n",
    "$\\boldsymbol{\\bar{x}}=3$, $\\boldsymbol{\\bar{y}}=4$ and $n=3$ so we have:\n",
    "\n",
    "$$\n",
    "cov(X,Y) = \\frac{(1-3)(5-4)+(5-3)(1-4)+(3-3)(6-4)}{3}=\\frac{-8}{3}=-2.67\n",
    "$$\n",
    "\n",
    "Ok, great! That the value of the covariance matrix.\n",
    "\n",
    "Now the easy way! With Numpy, the covariance matrix can be calculated with the function `np.cov`. It is worth noting that if you want Numpy to use the columns as vectors, the parameter `rowvar=False` has to be used. Also, `bias=True` allows to divide by $n$ and not by $n-1$.\n",
    "\n",
    "Let's create the array first:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 57,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[1, 3, 5],\n",
       "       [5, 4, 1],\n",
       "       [3, 8, 6]])"
      ]
     },
     "execution_count": 57,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A = np.array([[1, 3, 5], [5, 4, 1], [3, 8, 6]])\n",
    "A"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "Now we will calculate the covariance with the Numpy function:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 58,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 2.66666667,  0.66666667, -2.66666667],\n",
       "       [ 0.66666667,  4.66666667,  2.33333333],\n",
       "       [-2.66666667,  2.33333333,  4.66666667]])"
      ]
     },
     "execution_count": 58,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.cov(A, rowvar=False, bias=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "Looks good! "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "### Finding the covariance matrix with the dot product\n",
    "\n",
    "There is another way to compute the covariance matrix of $\\bs{A}$. You can center $\n",
    "\\bs{A}$ around 0 (subtract the mean of the vector to each element of the vector to have a vector of mean equal to 0, *cf*. below), multiply it with its own transpose and divide by the number of observations. Let's start with an implementation and then we'll try to understand the link with the previous equation:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 59,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [],
   "source": [
    "def calculateCovariance(X):\n",
    "    meanX = np.mean(X, axis = 0)\n",
    "    lenX = X.shape[0]\n",
    "    X = X - meanX\n",
    "    covariance = X.T.dot(X)/lenX\n",
    "    return covariance"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "Let's test it on our matrix $\\boldsymbol{A}$:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 60,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 2.66666667,  0.66666667, -2.66666667],\n",
       "       [ 0.66666667,  4.66666667,  2.33333333],\n",
       "       [-2.66666667,  2.33333333,  4.66666667]])"
      ]
     },
     "execution_count": 60,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "calculateCovariance(A)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "We end up with the same result as before!\n",
    "\n",
    "The explanation is simple. The dot product between two vectors can be expressed:\n",
    "\n",
    "$$\n",
    "\\bs{X^\\text{T}Y}= \\sum_{i=1}^{n}(x_i)(y_i)\n",
    "$$\n",
    "\n",
    "That's right, it is the sum of the products of each element of the vectors:\n",
    "\n",
    "<img src=\"images/dot-product.png\" width=\"400\" alt=\"The dot product corresponds to the sum of the products of each elements of the vectors\" title=\"The dot product.\">\n",
    "<em>The dot product corresponds to the sum of the products of each element of the vectors.</em>\n",
    "\n",
    "If $n$ is the number of elements in our vectors and that we divide by $n$:\n",
    "\n",
    "$$\n",
    "\\frac{1}{n}\\bs{X^\\text{T}Y}= \\frac{1}{n}\\sum_{i=1}^{n}(x_i)(y_i)\n",
    "$$\n",
    "\n",
    "You can note that this is not too far from the formula of the covariance we have seen above:\n",
    "\n",
    "$$\n",
    "cov(\\bs{X},\\bs{Y}) = \\frac{1}{n} \\sum_{i=1}^{n}(x_i-\\bar{x})(y_i-\\bar{y})\n",
    "$$\n",
    "\n",
    "The only difference is that in the covariance formula we subtract the mean of a vector to each of its elements. This is why we need to center the data before doing the dot product.\n",
    "\n",
    "Now if we have a matrix $\\bs{A}$, the dot product between $\\bs{A}$ and its transpose will give you a new matrix:\n",
    "\n",
    "<img src=\"images/covariance-dot-product.png\" width=\"400\" alt=\"Covariance matrix and dot product\" title=\"Covariance matrix and dot product.\">\n",
    "<em>If you start with a zero-centered matrix, the dot product between this matrix and its transpose will give you the variance of each vector and covariance between them, that is to say the covariance matrix.</em>\n",
    "\n",
    "This is the covariance matrix! 🌵"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "## B. Visualize data and covariance matrices\n",
    "\n",
    "In order to get more insights about the covariance matrix and how it can be useful, we will create a function used to visualize it along with 2D data. You will be able to see the link between the covariance matrix and the data.\n",
    "\n",
    "This function will calculate the covariance matrix as we have seen above. It will create two subplots: one for the covariance matrix and one for the data. The `heatmap` function from Seaborn is used to create gradients of color: small values will be colored in light green and large values in dark blue. The data is represented as a scatterplot. We choose one of our palette colors, but you may prefer other colors 🌈."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 61,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [],
   "source": [
    "def plotDataAndCov(data):\n",
    "    ACov = np.cov(data, rowvar=False, bias=True)\n",
    "    print('Covariance matrix:\\n', ACov)\n",
    "\n",
    "    fig, ax = plt.subplots(nrows=1, ncols=2)\n",
    "    fig.set_size_inches(10, 10)\n",
    "\n",
    "    ax0 = plt.subplot(2, 2, 1)\n",
    "    \n",
    "    # Choosing the colors\n",
    "    cmap = sns.color_palette(\"GnBu\", 10)\n",
    "    sns.heatmap(ACov, cmap=cmap, vmin=0)\n",
    "\n",
    "    ax1 = plt.subplot(2, 2, 2)\n",
    "    \n",
    "    # data can include the colors\n",
    "    if data.shape[1]==3:\n",
    "        c=data[:,2]\n",
    "    else:\n",
    "        c=\"#0A98BE\"\n",
    "    ax1.scatter(data[:,0], data[:,1], c=c, s=40)\n",
    "    \n",
    "    # Remove the top and right axes from the data plot\n",
    "    ax1.spines['right'].set_visible(False)\n",
    "    ax1.spines['top'].set_visible(False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "## C. Simulating data\n",
    "\n",
    "### Uncorrelated data\n",
    "\n",
    "Now that we have the plot function, we will generate some random data to visualize what the covariance matrice can tell us. We will start with some data drawn from a normal distribution with the Numpy function `np.random.normal()`.\n",
    "\n",
    "<img src=\"images/np.random.normal.png\" width=\"400\" alt=\"Parameters of numpy random normal\" title=\"Parameters of Numpy random normal.\">\n",
    "<em>Drawing sample from a normal distribution with Numpy.</em>\n",
    "\n",
    "This function needs the mean, the standard deviation and the number of observations of the distribution as input. We will create two random variables of 300 observations with a standard deviation of 1. The first will have a mean of 1 and the second a mean of 2. If we draw two times 300 observations from a normal distribution, both vectors will be uncorrelated."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 62,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(300, 2)"
      ]
     },
     "execution_count": 62,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "np.random.seed(1234)\n",
    "a1 = np.random.normal(2, 1, 300)\n",
    "a2 = np.random.normal(1, 1, 300)\n",
    "A = np.array([a1, a2]).T\n",
    "A.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "*Note 1*:  We transpose the data with `.T` because the original shape is (2, 300) and we want the number of observations as rows (so with shape (300, 2)).\n",
    "\n",
    "*Note 2*: We use `np.random.seed` function for reproducibility. The same random number will be used the next time we run the cell!\n",
    "\n",
    "Let's check how the data looks like:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 63,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 2.47143516,  1.52704645],\n",
       "       [ 0.80902431,  1.7111124 ],\n",
       "       [ 3.43270697,  0.78245452],\n",
       "       [ 1.6873481 ,  3.63779121],\n",
       "       [ 1.27941127, -0.74213763],\n",
       "       [ 2.88716294,  0.90556519],\n",
       "       [ 2.85958841,  2.43118375],\n",
       "       [ 1.3634765 ,  1.59275845],\n",
       "       [ 2.01569637,  1.1702969 ],\n",
       "       [-0.24268495, -0.75170595]])"
      ]
     },
     "execution_count": 63,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "A[:10,:]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "Nice, we have our two columns vectors.\n",
    "\n",
    "Now, we can check that the distributions are normal:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 64,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "sns.distplot(A[:,0], color=\"#53BB04\")\n",
    "sns.distplot(A[:,1], color=\"#0A98BE\")\n",
    "plt.show()\n",
    "plt.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "Looks good! We can see that the distributions have equivalent standard deviations but different means (1 and 2). So that's exactly what we have asked for!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "Now we can plot our dataset and its covariance matrix with our function:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 65,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false,
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Covariance matrix:\n",
      " [[ 0.95171641 -0.0447816 ]\n",
      " [-0.0447816   0.87959853]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x720 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plotDataAndCov(A)\n",
    "plt.show()\n",
    "plt.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "We can see on the scatterplot that the two dimensions are uncorrelated. Note that we have one dimension with a mean of 1 and the other with the mean of 2. Also, the covariance matrix shows that the variance of each variable is very large (around 1) and the covariance of columns 1 and 2 is very small (around 0). Since we insured that the two vectors are independent this is coherent (the opposite is not necessarily true: a covariance of 0 doesn't guaranty independency (see [here](https://stats.stackexchange.com/questions/12842/covariance-and-independence))."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "### Correlated data\n",
    "\n",
    "Now, let's construct dependent data by specifying one column from the other one."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 66,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Covariance matrix:\n",
      " [[0.95171641 0.92932561]\n",
      " [0.92932561 1.12683445]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x720 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "np.random.seed(1234)\n",
    "b1 =  np.random.normal(3, 1, 300)\n",
    "b2 = b1 + np.random.normal(7, 1, 300)/2.\n",
    "B = np.array([b1, b2]).T\n",
    "plotDataAndCov(B)\n",
    "plt.show()\n",
    "plt.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "The correlation between the two dimensions is visible on the scatter plot. We can see that a line could be drawn and used to predict $\\boldsymbol{y}$ from $\\boldsymbol{x}$ and vice versa. The covariance matrix is not diagonal (there are non-zero cells outside of the diagonal). That means that the covariance between dimensions is non-zero.\n",
    "\n",
    "That's great! ⚡️ We now have all the tools to see different preprocessing techniques."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "# 2. Preprocessing\n",
    "\n",
    "## A. Mean normalization\n",
    "\n",
    "Mean normalization is just removing the mean from each observation.\n",
    "\n",
    "$$\n",
    "\\bs{X'} = \\bs{X} - \\bar{x}\n",
    "$$\n",
    "\n",
    "where $\\bs{X'}$ is the normalized dataset, $\\bs{X}$ the original dataset and $\\bar{x}$ the mean of $\\bs{X}$.\n",
    "\n",
    "It will have the effect of centering the data around 0. We will create the function `center()` to do that:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 67,
   "metadata": {
    "code_folding": [],
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [],
   "source": [
    "def center(X):\n",
    "    newX = X - np.mean(X, axis = 0)\n",
    "    return newX"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "Let's give it a try with the matrix $\\bs{B}$ we have created above:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 68,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Before:\n",
      "\n",
      "\n",
      "Covariance matrix:\n",
      " [[0.95171641 0.92932561]\n",
      " [0.92932561 1.12683445]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x720 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "After:\n",
      "\n",
      "\n",
      "Covariance matrix:\n",
      " [[0.95171641 0.92932561]\n",
      " [0.92932561 1.12683445]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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wQKVR5JYN3bVcbcbUSDOOBERkR/udiOSx+BERGnht7/9LU6fPg1BEGAymbBx40bJwnciolAYnIgoLXz961/HunXrAAB//OMf8V//9V+47777VB4VEaUa7qojorRgMBi8X4+OjkIQBBVHQ0SpijNORJQ2fvOb3+Dtt9+GwWDAzp07Za/zNAqtq4u8YJ+IpjbuqktD3FWXnLirbvJ27dqFq1evBj2/bt06LF682Pv46NGjcDgcWLt2bcj7peuuOiKSxxknIpoyduzYoei65cuXY8+ePWGDExFRIAYnIkoLVqsVxcXFAICmpibccsstKo8oedzo2+SAeaLZJdsREEljcCKitPDrX/8aVqsVgiCgoKCAO+omNHb04v63zvp1Cj97ZRgAGJ6IJDA4EVFaePDBB9UeQlJqaO30C00A0Gt3oKG1k8GJSALbERARpbGBgNB043lngkdClBoYnIiI0phZr5N5ngsSRFIYnIiI0timilIUBoSnwokCcSIKxv+lICJKY546pvFddU6Y9RncVUcUAoMTEVGaqy0rZFAiUojBiSiFmbJuUnsIRERphTVORERERAoxOBEREREpxOBEREREpBCDExEREZFCDE5ERERECjE4ERERESnE4ERERESkEIMTERERkUJsgElEFAONHb0Tx5Y4YJ44643duImmHgYnIqJJauzoxf1vnUWv3eF97uyVYQBgeCKaYrhUR0Q0SQ2tnX6hCQB67Q40tHaqNCIiihcGJyKiSRoICE03nncmeCREFG8MTkREk2TW62SeZzUE0VTD4ERENEmbKkpRGBCeCicKxIloauH/DhERTZKnAHx8V50TZn0Gd9URTVEMTkREMVBbVsigRJQGuFRHREREpBCDExEREZFCDE5ERERECrHGiYj8tLS04NChQ3C73Vi9ejXWrFnj97rD4cD+/fvR3t6OadOmYcuWLbj55ptVGm3k/ud//geHDx/GCy+8AKPRqPZwiCjFcMaJiLzcbjcOHjyIhx9+GE899RTeffddXL582e+a48ePIycnBw0NDfja176GX//61yqNNnJ9fX1obW1FQUGB2kMhohTF4EREXufPn0dRURGmT5+OjIwMLFu2DE1NTX7XnD59GitXrgQA3HHHHfjoo48giqIKo43ciy++iG9961sQBEHtoRBRiuJSHRF5DQwMID8/3/s4Pz8f586dk71Gq9XCYDDg2rVrSb/s1dTUBLPZjLKysojf29bWFvsBEVHSWrBggexrcQ9O1j1fi/dHJIzFYkF1dbXawyAf6f5nUpw9M6LrLRYLLBaL93F1dfWU+vnt2rULV69eDXp+3bp1OHr0KLZv367oPp6fU11dXayHSEQpjjNOEUj3X9LJiH8mkQkXlMxmM/r7+72P+/v7YTabJa/Jz8+Hy+XC8PAwpk2bFrcxR2LHjh2Sz1+6dAk9PT348Y9/DGD8+9q6dSv27NmDm266Kej6ZAyUDz30EJ544gm1h+HF8YSXbGPieEJTOh4GJyLyKi8vh9VqRU9PD8xmM06cOIHNmzf7XfOFL3wBb775JubNm4f3338ft912W9LXDM2cORMvvPCC9/EPf/hD7NmzJ+mXF4ko+TA4EZGXVqvFhg0bsHv3brjdbqxatQqlpaU4cuQIysvLUVVVhS996UvYv38/Nm3ahNzcXGzZskXtYRMRJQyDUwSSbeqe+GcSD5WVlaisrPR77u677/Z+nZmZiQceeCDRw4qpAwcOqD2EiCXb33WOJ7xkGxPHE5rS8QhiquwjJiIiIlIZ+zgRERERKcSlOgXCHUFBiffss8+iubkZJpMJ+/btU3s4RHH329/+FqdPn4YgCDCZTNi4cWPQjsdEO3z4MD744ANkZGRg+vTp2LhxI3JyclQbz3vvvYdXXnkFXV1dePzxx1FeXq7KOJLtd0ay/XvZ19eHAwcO4OrVqxAEAdXV1fjqV7+q2njGxsawc+dOOJ1OuFwu3HHHHVi7dq38G0QKyeVyiffff7/Y3d0tOhwO8cEHHxQ7OzvVHlba+/jjj8ULFy6IDzzwgNpDIUqIoaEh79evvvqq+Pzzz6s4mnEtLS2i0+kURVEUDx8+LB4+fFjV8XR2dopdXV3izp07xfPnz6syhmT8nZFs/14ODAyIFy5cEEVRFIeHh8XNmzer+jNyu93iyMiIKIqi6HA4xG3btolnz56VvZ5LdWEoOYKCEm/hwoXIzc1VexhECWMwGLxfj46OJkULiNtvvx1arRYAMG/ePAwMDKg6npKSEtxyyy2qjiEZf2ck27+XeXl5mD17NgAgOzsbM2bMUPXvjiAI0Ov1AACXywWXyxXyvy8u1YWh5AgKIqJE+M1vfoO3334bBoMBO3fuVHs4fo4fP45ly5apPQzV8XdGZHp6evDpp59izpw5qo7D7XZj69at6O7uRk1NDebOnSt7LYMTEVGSCHVkzOLFi3HPPffgnnvuwdGjR/Haa6+FrsNI0JgA4He/+x20Wi2WL1+eFOOh1GC327Fv3z6sX7/eb0ZVDRqNBk8++SSGhoawd+9eXLp0CTNnSh9pxeAUhpIjKIiIYkHuyJhAy5cvx549exISnMKN6c0338QHH3yARx99NCHLh0p/Rmrh7wxlnE4n9u3bh+XLl+OLX/yi2sPxysnJwW233YaWlhbZ4MQapzB8j6BwOp04ceIEqqqq1B4WEaUZq9Xq/bqpqUn1Wh5gfPfYH/7wB2zduhVZWVlqDycp8HdGeKIo4rnnnsOMGTNQW1ur9nBgs9kwNDQEYHyHXWtrK2bMmCF7PRtgKtDc3IwXX3zRewTFP/zDP6g9pLT39NNP48yZM7h27RpMJhPWrl2LL33pS2oPiyhu9u7dC6vVCkEQUFBQgPvuu0/1mYxNmzbB6XR6C4/nzp2L++67T7XxnDp1Cr/4xS9gs9mQk5ODsrIyPPLIIwkfR7L9zki2fy//8pe/4NFHH8XMmTO9s5T33HNP0IkFiXLx4kUcOHAAbrcboihi6dKl+Md//EfZ6xmciIiIiBTiUh0RERGRQgxORERERAoxOBEREREpxOBEREREpBCDExEREZFCDE5ERERECjE4ERERESnE4ERERESk0P8HHeXoxOq5kzQAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 720x720 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "BCentered = center(B)\n",
    "\n",
    "print('Before:\\n\\n')\n",
    "\n",
    "plotDataAndCov(B)\n",
    "plt.show()\n",
    "plt.close()\n",
    "\n",
    "print('After:\\n\\n')\n",
    "\n",
    "plotDataAndCov(BCentered)\n",
    "plt.show()\n",
    "plt.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "The first plot shows again the original data $\\bs{B}$ and the second plot shows the centered data (look at the scale)."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "## B. Standardization\n",
    "\n",
    "The standardization is used to put all features on the same scale. The way to do it is to divide each zero-centered dimension by its standard deviation.\n",
    "\n",
    "$$\n",
    "\\bs{X'} = \\frac{\\bs{X} - \\bar{x}}{\\sigma_{\\bs{X}}}\n",
    "$$\n",
    "\n",
    "where $\\bs{X'}$ is the standardized dataset, $\\bs{X}$ the original dataset, $\\bar{x}$ the mean of $\\bs{X}$ and $\\sigma_{\\bs{X}}$ the standard deviation of $\\bs{X}$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 69,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [],
   "source": [
    "def standardize(X):\n",
    "    newX = center(X)/np.std(X, axis = 0)\n",
    "    return newX"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "Let's create another dataset with a different scale to check that it is working."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 70,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Covariance matrix:\n",
      " [[0.95171641 0.83976242]\n",
      " [0.83976242 6.22529922]]\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk0AAAEWCAYAAAB7W6PxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4xLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy8li6FKAAAgAElEQVR4nO3de3BUZZ438O9JpzudhHSThARiCGRAUKAMDIaLtwEhJdQMM0Vt7aLD6AvLvs4LKGzGGcuUuyuwW7NSagbkVrgyCy4zf8gfQwby6quTjWApyi2yQWiDTggGJJIb6dw6fTvvH003fTmn+3Snu09fvp+qqSLdJ+c8YRL85nl+z+8RRFEUQURERERBZag9ACIiIqJkwNBEREREpABDExEREZECDE1ERERECjA0ERERESnA0EREJMNkMsFkMqk9DCJKEJmxfsBXt5tj/QiilHD/2IqwPyf7f70T1vXD/7Um7GcQEZELZ5qIiIiIFGBoIiIiIlKAoYmIiIhIAYYmIiIiIgViXghORMllcHAQ+/fvR3t7OwRBwIYNGzB9+nTP+6Io4uDBg/jiiy+QlZWFjRs3YsqUKSqOmIgoPhiaiMjHwYMHMWfOHPz617+G3W7HyMiIz/tffPEFOjo6sGvXLnz99dc4cOAA/v3f/12l0RIRxQ+X54jIY2hoCCaTCUuWLAEAZGZmIjc31+eac+fO4Uc/+hEEQcD06dMxODiI3t5eNYZLRBRXnGkiIo9bt27BYDBg3759uHbtGqZMmYK1a9dCr9d7runp6cG4ceM8HxcWFqKnpwf5+flqDJmIKG4YmojSSENDAxoaGjwfV1VVoaqqyvOxw+HA1atXsW7dOkybNg0HDx5EXV0dnnrqKTWGS0SUUBiaiNKIf0jyV1hYiMLCQkybNg0AsHDhQtTV1flcU1BQgK6uLs/H3d3dKCgoiM2AiYgSCGuaiMhj7NixKCwsxHfffQcAuHjxIiZOnOhzTWVlJT7++GOIoogrV64gJyeHS3NElBY400REPtatW4ddu3bBbrejuLgYGzduxIcffggAeOKJJ/DDH/4QTU1N2Lx5M3Q6HTZu3KjyiImI4kMQRVGM5QN4YC+RMjywN3r27duHpqYmGI1G1NbW+rx3/PhxHD58GAcOHIDBYAh6H5PJBACYMWNGzMZKRMmDy3NElHIWL16Ml19+OeD1rq4uNDc3++z+IyJSiqGJiFLOzJkzMWbMmIDX33nnHfziF7+AIAgqjIqIkh1DExGlhbNnz6KgoADl5eUhr21oaEBNTU3sB0VESYWhiYhS3sjICI4ePYonn3xS0fVVVVXYvn17jEdFRMmGu+eIKOV9//33uHXrFl588UUArt5SL730El599VWMHTtW5dElh/q2TuxubkePxYYCvRabKsqworxI7WERxRVDExGlvEmTJuHAgQOej5977jm8+uqrIXfPkUt9WyeeP9mCTovN81pL7xAAMDhRWuHyHBGlnJ07d+Kf//mf8d1332H9+vVobGxUe0hJbXdzu09gAoBOiw27m9tVGhGROjjTREQpp7q6Ouj7e/fujdNIUkOPX2C6+7o9ziMhUhdnmoiIKKgCvVbmdf7eTemFoYmIiILaVFGGIr/gVHSnGJwonfDXBCIiCspd7O3aPWdHgT6Tu+coLTE0ESWxsaU8DoTiY0V5EUMSpT0uzxEREREpwNBEREREpABDExEREZECDE1ERERECjA0ERERESnA0ERERESkAEMTERERkQLs00RElCLq2zrvNKC0oeBOx272ViKKHoYmIqIUUN/WiedPtqDT63Ddlt4hAGBwIooSLs8REaWA3c3tPoEJADotNuxubldpRESph6GJiCgF9PgFpruv2+M8EqLUxdBERJQCCvRamddZhUEULQxNREQpYFNFGYr8glPRnWJwIooO/gpCRJQC3MXert1zdhToM2O+e4679SjdMDQREaWIFeVFcQst3K1H6YjLc0REFDbu1qN0xJkmIqI0F8kyG3frUTpiaCIiSmORLrNFuluPdVCUzBiaiIjSWLBltmBhZlNFGVp6h3w+N9RuPdZBUbJjaCIiSmORLrNFslsv0oBGlCgYmogo5ezbtw9NTU0wGo2ora0FABw+fBjnz59HZmYmxo8fj40bNyI3N1flkapvNE0xw92txzooSnbcPUdEKWfx4sV4+eWXfV6rqKhAbW0t3njjDZSUlODo0aMqjS6xSDXF1AoCrpmHsexYE+rbOqP2LHYtp2TH71QiSjkzZ87ErVu3fF6bPXu258/Tp0/H559/Hu9hJSTvZbZr/RZ0DI7AJopoH7SifdAa1ZqjSOqgiBIJQxMRpZ3GxkY8/PDDsu83NDSgoaEBa9asieOo1ONeZlt2rAntAyM+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\n",
      "text/plain": [
       "<Figure size 720x720 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "np.random.seed(1234)\n",
    "c1 =  np.random.normal(3, 1, 300)\n",
    "c2 = c1 + np.random.normal(7, 5, 300)/2.\n",
    "C = np.array([c1, c2]).T\n",
    "\n",
    "plotDataAndCov(C)\n",
    "plt.xlim(0, 15)\n",
    "plt.ylim(0, 15)\n",
    "plt.show()\n",
    "plt.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "We can see that the scales of $x$ and $y$ are different. Note also that the correlation seems smaller because of the scale differences. Now let's standardise it:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 71,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Covariance matrix:\n",
      " [[1.         0.34500274]\n",
      " [0.34500274 1.        ]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x720 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "CStandardized = standardize(C)\n",
    "\n",
    "plotDataAndCov(CStandardized)\n",
    "plt.show()\n",
    "plt.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "Looks good! You can see that the scales are the same and that the dataset is zero-centered according to both axes. Now, have a look at the covariance matrix: you can see that the variance of each coordinate (the top-left cell and the bottom-right cell) is equal to 1. By the way, this new covariance matrix is actually the correlation matrix!💥 The Pearson correlation coefficient between the two variables ($\\bs{c1}$ and $\\bs{c2}$) is 0.54220151."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "## C. Whitening\n",
    "\n",
    "Whitening or sphering data means that we want to transform it in a way to have a covariance matrix that is the identity matrix (1 in the diagonal and 0 for the other cells; [more details on the identity matrix](https://hadrienj.github.io/posts/Deep-Learning-Book-Series-2.3-Identity-and-Inverse-Matrices/)). It is called whitening in reference to white noise.\n",
    "\n",
    "Whitening is a bit more complicated but we now have all the tools that we need to do it. It involves the following steps:\n",
    "\n",
    "    1- Zero-center the data\n",
    "    2- Decorrelate the data\n",
    "    3- Rescale the data\n",
    "    \n",
    "Let's take again $\\bs{C}$ and try to do these steps.\n",
    "\n",
    "#### 1. Zero-centering"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 72,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Covariance matrix:\n",
      " [[0.95171641 0.83976242]\n",
      " [0.83976242 6.22529922]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x720 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "CCentered = center(C)\n",
    "\n",
    "plotDataAndCov(CCentered)\n",
    "plt.show()\n",
    "plt.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "#### 2. Decorrelate\n",
    "\n",
    "At this point, we need to decorrelate our data. Intuitively, it means that we want to rotate the data until there is no correlation anymore. Look at the following cartoon to see what I mean:\n",
    "\n",
    "<img src=\"images/rotation.png\" width=\"500\" alt=\"Rotation to decorrelate the data\" title=\"The rotation can decorrelate the data.\">\n",
    "<em>The left plot shows correlated data. For instance, if you take a data point with a big $x$ value, chances are that $y$ will also be quite big. Now take all data points and do a rotation (maybe around 45 degrees counterclockwise): the new data (plotted on the right) is not correlated anymore.</em>\n",
    "\n",
    "The question is: how could we find the right rotation in order to get the uncorrelated data? Actually, it is exactly what the **eigenvectors** of the covariance matrix do: they indicate the direction where the spread of the data is at its maximum:\n",
    "\n",
    "<img src=\"images/maxVar.png\" width=\"300\" alt=\"Direction where the variance is maximum\" title=\"There is one direction where the variance is maximum.\">\n",
    "<em>The eigenvectors of the covariance matrix give you the direction that maximizes the variance. The direction of the green line is where the variance is maximum. Just look at the smallest and largest point projected on this line: the spread is big. Compare that with the projection on the orange line: the spread is very small.</em>\n",
    "\n",
    "For more details about the eigendecomposition, see [this post](https://hadrienj.github.io/posts/Deep-Learning-Book-Series-2.7-Eigendecomposition/).\n",
    "\n",
    "So we can decorrelate the data by projecting it on the eigenvectors basis. This will have the effect to apply the rotation needed and remove correlations between the dimensions. Here are the steps:\n",
    "\n",
    "    1- Calculate the covariance matrix\n",
    "    2- Calculate the eigenvectors of the covariance matrix\n",
    "    3- Apply the matrix of eigenvectors to the data (this will apply the rotation)\n",
    "    \n",
    "Let's pack that into a function:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 73,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [],
   "source": [
    "def decorrelate(X):\n",
    "    newX = center(X)\n",
    "    cov = X.T.dot(X)/float(X.shape[0])\n",
    "    # Calculate the eigenvalues and eigenvectors of the covariance matrix\n",
    "    eigVals, eigVecs = np.linalg.eig(cov)\n",
    "    # Apply the eigenvectors to X\n",
    "    decorrelated = X.dot(eigVecs)\n",
    "    return decorrelated"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "Let's try to decorrelate our zero-centered matrix $\\bs{C}$ to see it in action:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 74,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Covariance matrix:\n",
      " [[0.95171641 0.83976242]\n",
      " [0.83976242 6.22529922]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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zwAA/uIv/kLTO+m6urpgtVqxZ88etLe3o7KyEhs3bgwFXzGsNBERkWG5XC5s374dGzduRFFRkdbLQV5eHp5//nns3bsXf/7zn/HFF19otpaPP/4YNpstVJHTg5/97Gf4j//4Dzz55JN4++23cebMGc3W4vP5cPHiRdx999147rnnMGHCBBw4cED2exiaFKg5VoKIKJX49446Xq8X27dvx5133onbbrtN6+VEKC4uxsKFC3Hy5EnN1nD27FmcOHECDz30EHbs2IFPP/0UO3fu1Gw9AEL/HttsNtx66634/PPPNVuL3W6H3W4PVQOXLl2Kixcvyn4PQ5MCNcdKEBGlEv/eURYIBLB3716Ul5dj7dq1Wi8HAOB0OjE8PAxg/E661tZWlJeXa7ae9evXY+/evWhsbMTWrVvxjW98A4888ohm63G5XKFtQpfLhdbWVsyaFd+h46k0adIk2O12fPnllwCAU6dOKd5IwOGWKrS0tODVV18NHSvxgx/8QOsl5bwdO3bgzJkzGBwchM1mQ11dXaiZjygb6O3vHb39N/fZZ5/hqaeewqxZs0LN1j/+8Y9jptlnUnt7OxobG+H3+xEIBLBs2TL88Ic/1Gw94U6fPo0333xT05EDX331FV544QUA41tj3/72tzX/97qtrQ179+6F1+vF1KlTsXnzZtkbHhiaiIiIiFTg9hwRERGRCgxNRERERCowNBERERGpwNBEREREpAJDExEREZEKDE1EREREKjA0EREREanA0ERERESkwv8HFiPLT98MgcIAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 720x720 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Covariance matrix:\n",
      " [[8.21222171e-01 8.88178420e-17]\n",
      " [8.88178420e-17 6.35579346e+00]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 720x720 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plotDataAndCov(C)\n",
    "plt.show()\n",
    "plt.close()\n",
    "\n",
    "CDecorrelated = decorrelate(CCentered)\n",
    "plotDataAndCov(CDecorrelated)\n",
    "plt.xlim(-5,5)\n",
    "plt.ylim(-5,5)\n",
    "plt.show()\n",
    "plt.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "Nice! This is working 🎄\n",
    "\n",
    "We can see that the correlation is not here anymore and that the covariance matrix (now a diagonal matrix) confirms that the covariance between the two dimensions is equal to 0."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "#### 3. Rescale the data\n",
    "\n",
    "The next step is to scale the uncorrelated matrix in order to obtain a covariance matrix corresponding to the identity matrix (ones on the diagonal and zeros on the other cells). To do that we scale our decorrelated data by dividing each dimension by the square-root of its corresponding eigenvalue."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 75,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [],
   "source": [
    "def whiten(X):\n",
    "    newX = center(X)\n",
    "    cov = X.T.dot(X)/float(X.shape[0])\n",
    "    # Calculate the eigenvalues and eigenvectors of the covariance matrix\n",
    "    eigVals, eigVecs = np.linalg.eig(cov)\n",
    "    # Apply the eigenvectors to X\n",
    "    decorrelated = X.dot(eigVecs)\n",
    "    # Rescale the decorrelated data\n",
    "    whitened = decorrelated / np.sqrt(eigVals + 1e-5)\n",
    "    return whitened"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "*Note:* we add a small value (here $10^{-5}$) to avoid the division by $0$."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 76,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Covariance matrix:\n",
      " [[9.99987823e-01 1.62832710e-17]\n",
      " [1.62832710e-17 9.99998427e-01]]\n"
     ]
    },
    {
     "data": {
      "image/png": "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mz733e9+N+ODAQAAyFdOuwcAAAAwGbBnEQAAExxhgkiEJgAADHCECWKxPAcAgIFER5igMDHTBCDK8ePHtW/fPgUCAa1Zs0br16+Pev7gwYP67W9/K5fLpbKyMn37299WZSX/1Y2phyNMEIuZJgBhgUBAe/fu1cMPP6zHH39cb731ls6cORN1TU1NjR599FE99thjuv766/XCCy/YNFoguzjCBLEITQDCTp06pblz56qqqkpFRUVauXKljh49GnXNl7/8ZU2fPl2SdOWVV6qvr8+OoQJZt3l5tSpjghNHmBQ24jJQQCLPhZSijzySpL6+PlVUVIQfV1RU6OTJk6b3O3TokK699trsDBawGUeYIBahCZjEZk8rT+n6GxqWR4WkiXjjjTfU1tamxsbGjNwPyEccYYJILM8BCPN4POrt7Q0/7u3tlcfjibuupaVFL730kh544AG53cZ1HwAw1RCaAITV1taqs7NTXV1dGh0d1eHDh1VfXx91zSeffKKnn35aDzzwgMrLU5vpAoDJjOU5AGEul0ubNm3Sjh07FAgEtGrVKlVXV2v//v2qra1VfX29XnjhBfl8Pv34xz+WJM2ZM0cPPvigzSMHgOxzBIPBYDZfoHP402zeHmlY/Hev2j0EGBj++caUf+ejcy0pXf+ly5an/BqFrLW1VZK0dOlSm0cCIB+wPAcAAGABoQkAAMACQhMAAIAFhCYAAAALCE0AAAAWEJoAAAAsIDQBAABYQGgCAACwgNAEAABgAaEJAADAAkITAACABYQmAAAACwhNAAAAFhCaAAAALCA0AQAAWEBoAgAAsIDQBKCgvPLKK7rlllvk9XrtHgqASYbQBKBg9PT0qKWlRXPmzLF7KAAmIUITgILx3HPP6Rvf+IYcDofdQwEwCRGaABSEo0ePyuPxqKamJum1TU1N2rJlS/YHBWBSKbJ7AADSVz79MruHkFe2b9+uc+fOxf38tttu00svvaStW7dauk9DQ4MaGhrU2tqa6SECmMQITQCmjEceecTw559++qm6urp0//33S5J6e3v14IMPaufOnbrsMoInAGsITQCmvIULF+qZZ54JP/7Od76jnTt3qqyszMZRAZhsqGkCAACwgJkmAAXnqaeesnsIACYhZpoAAAAsIDQBAABYQGgCAACwgNAEAABgAaEJAADAAkITAACABYQmAAAACwhNAAAAFhCaAAAALCA0AQAAWEBoAgAAsIDQBAAAYAGhCQAAwAJCEwAAgAWEJgAAAAuK7B4AgPxy/Phx7du3T4FAQGvWrNH69eujnvf7/dqzZ4/a2to0a9Ys3Xfffbr88sttGi0A5A4zTQDCAoGA9u7dq4cffliPP/643nrrLZ05cybqmkOHDmnGjBnavXu3vva1r+nf/u3fbBotAOQWoQlA2KlTpzR37lxVVVWpqKhIK1eu1NGjR6Oueffdd3XzzTdLkq6//nq9//77CgaDNowWAHKL5TkAYX19faqoqAg/rqio0MmTJ02vcblcKi0t1eDgoMrKynI61lxqbW21ewgAcmjp0qWGP896aJpXsjDbL5EzTU1NamhosHsYEzb88412DyFjpsqfSbpS/f9XU1OTmpqawo8bGhoK+vMDgFQw05SCQv+Czkf8maQmWUjyeDzq7e0NP+7t7ZXH4zG8pqKiQmNjYxoaGtKsWbOyNmY7mf3XZqZt2bJFjz76aE5eK9umynuZKu9D4r1kEjVNAMJqa2vV2dmprq4ujY6O6vDhw6qvr4+65o//+I/12muvSZLefvttXX311XI4HDaMFgByi5kmAGEul0ubNm3Sjh07FAgEtGrVKlVXV2v//v2qra1VfX29Vq9erT179mjz5s2aOXOm7rvvPruHDQA5QWhKActA+Yc/k8yrq6tTXV1d1M9uvfXW8D9PmzZN3/ve93I9rCltKv17PFXey1R5HxLvJZMcQfYKAwAAJEVNEwAAgAUsz1mQ7FgJ5N6//uu/qrm5WeXl5dq1a5fdwwEy5pVXXtHzzz+vZ555ZlL2vnr++ed17NgxFRUVqaqqSnfffbdmzJhh97BSMlX+zu/p6dFTTz2lc+fOyeFwqKGhQV/96lftHlbaAoGAtmzZIo/Hoy1bttgyBmaakrByrARy7+abb9bDDz9s9zCAjOrp6VFLS4vmzJlj91DStnz5cu3atUuPPfaY5s2bp5deesnuIaVkKv2d73K5dMcdd+jxxx/Xjh079Jvf/GbSvhdJ+vWvf6358+fbOgZCUxJWjpVA7i1btkwzZ860exhARj333HP6xje+MalbOFxzzTVyuVySpCVLlqivr8/mEaVmKv2dP3v2bC1evFiSVFJSovnz50+6P4+Q3t5eNTc3a82aNbaOg9CUhNGxEpP1XzoA+evo0aPyeDyqqamxeygZc+jQIV177bV2DyMlU/Xv/K6uLn3yySe64oor7B5KWp599lndfvvttv8HBTVNAJAj27dv17lz5+J+ftttt+mll17S1q1bbRhV6hK9j+uuu06S9Itf/EIul0s33nhjroeHGD6fT7t27dKdd96p0tJSu4eTsmPHjqm8vFyLFy/WBx98YOtYCE1JWDlWAgCseOSRRwx//umnn6qrq0v333+/pPG/Zx588EHt3LlTl112WS6HaInZ+wh57bXXdOzYMf3whz+0fWYgVVPt7/zR0VHt2rVLN954o77yla/YPZy0nDhxQu+++67ee+89jYyMaHh4WD/5yU9077335nwshKYkIo+V8Hg8Onz4sC1/UACmroULF+qZZ54JP/7Od76jnTt3Tsrdc8ePH9cvf/lLbdu2TdOnT7d7OCmbSn/nB4NB/fSnP9X8+fO1bt06u4eTtg0bNmjDhg2SpA8++ECvvPKKbX8mhKYkzI6VgL2eeOIJffjhhxocHNTf//3f65ZbbtHq1avtHhZQ8Pbu3avR0VFt375dknTllVfqW9/6ls2jsm4q/Z1/4sQJvfHGG1q4cGF4FvPrX/96XMd/WEdHcAAAAAvYPQcAAGABoQkAAMACQhMAAIAFhCYAAAALCE0AAAAWEJoAAAAsIDQBAABYQGgCAACw4P8DtnBS/1o2OFcAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<Figure size 720x720 with 3 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "CWhitened = whiten(CCentered)\n",
    "\n",
    "plotDataAndCov(CWhitened)\n",
    "plt.xlim(-5,5)\n",
    "plt.ylim(-5,5)\n",
    "plt.show()\n",
    "plt.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "Hooray! We can see that with the covariance matrix that this is all good. We have something that really looks to the identity matrix ($1$ on the diagonal and $0$ elsewhere). 🌵"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "# 3. Image whitening\n",
    "\n",
    "We will see how whitening can be applied to preprocess image dataset. To do so we will use the paper of [Pal & Sudeep (2016)](https://ieeexplore.ieee.org/document/7808140/) where they give some details about the process. This preprocessing technique is called Zero component analysis (ZCA).\n",
    "\n",
    "Check out the paper, but here is the kind of result they got:\n",
    "\n",
    "<img src=\"images/whitening-images-cifar10-pal-sudeep.png\" width=\"800\" alt=\"Whitening images from the CIFAR10 dataset. Results from the paper of Pal & Sudeep (2016).\">\n",
    "<em>Whitening images from the CIFAR10 dataset. Results from the paper of Pal & Sudeep (2016). The original images (left) and the images after the ZCA (right) are shown.</em>\n",
    "\n",
    "First thing first: we will load images from the CIFAR dataset. This dataset is available from Keras but you can also download it [here](https://www.cs.toronto.edu/~kriz/cifar.html)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 77,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(50000, 32, 32, 3)"
      ]
     },
     "execution_count": 77,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from keras.datasets import cifar10\n",
    "\n",
    "(X_train, y_train), (X_test, y_test) = cifar10.load_data()\n",
    "\n",
    "X_train.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "The training set of the CIFAR10 dataset contains 50000 images. The shape of `X_train` is (50000, 32, 32, 3). Each image is 32px by 32px and each pixel contains 3 dimensions (R, G, B). Each value is the brightness of the corresponding color between 0 and 255.\n",
    "\n",
    "We will start by selecting only a subset of the images, let's say 1000:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 78,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1000, 32, 32, 3)\n"
     ]
    }
   ],
   "source": [
    "X = X_train[:1000]\n",
    "print(X.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "That's better! Now we will reshape the array to have flat image data with one image per row. Each image will be (1, 3072) because $32 \\times 32 \\times 3 = 3072$. Thus, the array containing all images will be (1000, 3072):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 79,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false,
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1000, 3072)\n"
     ]
    }
   ],
   "source": [
    "X = X.reshape(X.shape[0], X.shape[1]*X.shape[2]*X.shape[3])\n",
    "print(X.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "The next step is to be able to see the images. The function `imshow()` from Matplotlib ([doc](https://matplotlib.org/api/_as_gen/matplotlib.pyplot.imshow.html)) can be used to show images. It needs images with the shape ($M \\times N \\times 3$) so let's create a function to reshape the images and be able to visualize them from the shape (1, 3072)."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 80,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [],
   "source": [
    "def plotImage(X):\n",
    "    plt.figure(figsize=(1.5, 1.5))\n",
    "    plt.imshow(X.reshape(32,32,3))\n",
    "    plt.grid(None)\n",
    "    plt.show()\n",
    "    plt.close()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "For instance, let's plot one of the images we have loaded:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 81,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 108x108 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plotImage(X[12, :])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "Cute! 🌵"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "We can now implement the whitening of the images. [Pal & Sudeep (2016)](https://ieeexplore.ieee.org/document/7808140/) describe the process:\n",
    "\n",
    "1. The first step is to rescale the images to obtain the range [0, 1] by dividing by 255 (the maximum value of the pixels).\n",
    "\n",
    "Remind that the formula to obtain the range [0, 1] is:\n",
    "\n",
    "$$\\frac{data - min(data)}{max(data) - min(data)}$$\n",
    "\n",
    "but here, the minimum value is 0, so this leads to:\n",
    "\n",
    "$$\\frac{data}{max(data)} = \\frac{data}{255}$$"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 82,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "X.min() 0.0\n",
      "X.max() 1.0\n"
     ]
    }
   ],
   "source": [
    "X_norm = X / 255.\n",
    "print('X.min()', X_norm.min())\n",
    "print('X.max()', X_norm.max())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "### Mean subtraction: per-pixel or per-image?\n",
    "\n",
    "Ok cool, the range of our pixel values is between 0 and 1 now. The next step is:\n",
    "\n",
    "2. Subtract the mean from all image.\n",
    "\n",
    "Be careful here 🌪🎢:\n",
    "\n",
    "One way to do it is to take each image and remove the mean of this image from every pixel ([Jarrett et al., 2009](https://www.computer.org/csdl/proceedings/iccv/2009/4420/00/05459469.pdf)). The intuition behind this process is that it centers the pixels of each image around 0.\n",
    "\n",
    "Another way to do it is to take each of the 3072 pixels that we have (32 by 32 pixels for R, G and B) for every image and subtract the mean of that pixel across all images. This is called per-pixel mean subtraction. This time, each pixel will be centered around 0 *according to all images*. When you will feed your network with the images, each pixel is considered as a different feature. With the per-pixel mean subtraction, we have centered each feature (pixel) around 0. This technique is commonly used (e.g [Wan et al., 2013](http://proceedings.mlr.press/v28/wan13.html)).\n",
    "\n",
    "We will now do the per-pixel mean subtraction from our 1000 images. Our data are organized with these dimensions (images, pixels). It was (1000, 3072) because there are 1000 images with $32 \\times 32 \\times 3 = 3072$ pixels. The mean per-pixel can thus be obtained from the first axis:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 83,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3072,)"
      ]
     },
     "execution_count": 83,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_norm.mean(axis=0).shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "This gives us 3072 values which is the number of means: one per pixel. Let's see the kind of values we have:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 84,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([0.5234    , 0.54323137, 0.5274    , ..., 0.50369804, 0.50011765,\n",
       "       0.45227451])"
      ]
     },
     "execution_count": 84,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_norm.mean(axis=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "This is near 0.5 because we already have normalized to the range [0, 1]. However, we still need to remove the mean from each pixel:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 85,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [],
   "source": [
    "X_norm = X_norm - X_norm.mean(axis=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "Just to convince ourselves that it worked, we will compute the mean of the first pixel. Let's hope that it is 0."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 86,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([-5.30575583e-16, -5.98021632e-16, -4.23439062e-16, ...,\n",
       "       -1.81965554e-16, -2.49800181e-16,  3.98570066e-17])"
      ]
     },
     "execution_count": 86,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_norm.mean(axis=0)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "This is not exactly 0 but it is small enough that we can consider that it worked! 🌵"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "Now we want to calculate the covariance matrix of the zero-centered data. Like we have seen above, we can calculate it with the `np.cov()` function from Numpy.\n",
    "\n",
    "There are two possible correlation matrices that we can calculate from the matrix $\\bs{X}$: either the correlation between rows or between columns. In our case, each row of the matrix $\\bs{X}$ is an image, so the rows of the matrix correspond to the observations and the columns of the matrix corresponds to the features (the images pixels). We want to calculate the correlation between the pixels because the goal of the whitening is to remove these correlations to force the algorithm to focus on higher-order relations.\n",
    "\n",
    "To do so, we will tell this to Numpy with the parameter `rowvar=False` (see the [doc](https://docs.scipy.org/doc/numpy/reference/generated/numpy.cov.html)): it will use the columns as variables (or features) and the rows as observations."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 106,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [],
   "source": [
    "cov = np.cov(X_norm, rowvar=False)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "The covariance matrix should have a shape of 3072 by 3072 to represent the correlation between each pair of pixels (and there are 3072 pixels):"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 94,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(3072, 3072)"
      ]
     },
     "execution_count": 94,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cov.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "Now the magic part: we will calculate the singular values and vectors of the covariance matrix and use them to rotate our dataset. Have a look at [my post](https://hadrienj.github.io/posts/Deep-Learning-Book-Series-2.8-Singular-Value-Decomposition/) on the singular value decomposition if you need more details!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 90,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [],
   "source": [
    "U,S,V = np.linalg.svd(cov)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "In the paper, they used the following equation:\n",
    "\n",
    "$$\n",
    "\\bs{X}_{ZCA} = \\bs{U}.diag(\\frac{1}{\\sqrt{diag(\\bs{S}) + \\epsilon}}).\\bs{U^\\text{T}.X}\n",
    "$$\n",
    "\n",
    "with $\\bs{U}$ the left singular vectors, and $\\bs{S}$ the singular values of the covariance of the initial normalized dataset of images and $\\bs{X}$ the normalized dataset. $\\epsilon$ (*epsilon*) is an hyper-parameter called the whitening coefficient. $diag(a)$ corresponds to a matrix with the vector $a$ as a diagonal and 0 in all other cells.\n",
    "\n",
    "We will try to implement this equation. Let's start by checking the dimensions of the SVD:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 91,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(3072, 3072) (3072,)\n"
     ]
    }
   ],
   "source": [
    "print(U.shape, S.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "$\\bs{S}$ is a vector containing 3072 elements (the singular values). $diag(\\bs{S})$ will thus be of shape (3072, 3072) with $\\bs{S}$ as the diagonal:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 92,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[5.46967832e+01 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n",
      "  0.00000000e+00 0.00000000e+00]\n",
      " [0.00000000e+00 2.02861434e+01 0.00000000e+00 ... 0.00000000e+00\n",
      "  0.00000000e+00 0.00000000e+00]\n",
      " [0.00000000e+00 0.00000000e+00 1.24476904e+01 ... 0.00000000e+00\n",
      "  0.00000000e+00 0.00000000e+00]\n",
      " ...\n",
      " [0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 5.20778268e-15\n",
      "  0.00000000e+00 0.00000000e+00]\n",
      " [0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n",
      "  2.60364571e-15 0.00000000e+00]\n",
      " [0.00000000e+00 0.00000000e+00 0.00000000e+00 ... 0.00000000e+00\n",
      "  0.00000000e+00 2.25901923e-15]]\n",
      "\n",
      "shape: (3072, 3072)\n"
     ]
    }
   ],
   "source": [
    "print(np.diag(S))\n",
    "print('\\nshape:', np.diag(S).shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "$diag(\\frac{1}{\\sqrt{diag(\\bs{S}) + \\epsilon}})$ is also of shape (3072, 3072) as well as $\\bs{U}$ and $\\bs{U^{\\text{T}}}$. We have seen also that $\\bs{X}$ has the shape (1000, 3072) and we need to transpose it to have (3072, 1000). The shape of $\\bs{X}_{ZCA}$ is thus:\n",
    "\n",
    "$$\n",
    "(3072, 3072) . (3072, 3072) . (1000, 3072)^{\\text{T}} = (3072, 3072) . (3072, 1000) = (3072, 1000)\n",
    "$$\n",
    "\n",
    "which corresponds to the shape of the initial dataset after transposition. Nice!\n",
    "\n",
    "We have:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 97,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [],
   "source": [
    "epsilon = 0.1\n",
    "X_ZCA = U.dot(np.diag(1.0/np.sqrt(S + epsilon))).dot(U.T).dot(X_norm.T).T"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Let's rescale the images:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 101,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "min: 0.0\n",
      "max: 1.0\n"
     ]
    }
   ],
   "source": [
    "X_ZCA_rescaled = (X_ZCA - X_ZCA.min()) / (X_ZCA.max() - X_ZCA.min())\n",
    "print('min:', X_ZCA_rescaled.min())\n",
    "print('max:', X_ZCA_rescaled.max())"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Finally, we can look at the effect of whitening by comparing an image before and after whitening:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 105,
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 108x108 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 108x108 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plotImage(X[12, :])\n",
    "plotImage(X_ZCA_rescaled[12, :])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "Hooray! That's great!⚡️It looks like the images from the paper [Pal & Sudeep (2016)](https://ieeexplore.ieee.org/document/7808140/). They used `epsilon = 0.1`. You can try other values to see the effect on the image."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "That's all! 🌴\n",
    "\n",
    "I hope that you found something interesting in this notebook! You can find it in a nicer layout on my [blog](https://hadrienj.github.io/posts/Preprocessing-data-for-machine-learning-and-deep-learning/), along with other articles!"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "hideCode": false,
    "hidePrompt": false
   },
   "source": [
    "# References\n",
    "\n",
    "[K. Jarrett, K. Kavukcuoglu, M. Ranzato, and Y. LeCun, “What is the best multi-stage architecture for object recognition?,” in 2009 IEEE 12th International Conference on Computer Vision, 2009, pp. 2146–2153.\n",
    "](https://www.computer.org/csdl/proceedings/iccv/2009/4420/00/05459469.pdf)\n",
    "\n",
    "[A. Krizhevsky, “Learning Multiple Layers of Features from Tiny Images,” Master’s thesis, University of Tront, 2009.\n",
    "](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.222.9220&rep=rep1&type=pdf)\n",
    "\n",
    "[Y. A. LeCun, L. Bottou, G. B. Orr, and K.-R. Müller, “Efficient BackProp,” in Neural Networks: Tricks of the Trade, Springer, Berlin, Heidelberg, 2012, pp. 9–48.\n",
    "](http://yann.lecun.com/exdb/publis/pdf/lecun-98b.pdf)\n",
    "\n",
    "[K. K. Pal and K. S. Sudeep, “Preprocessing for image classification by convolutional neural networks,” in 2016 IEEE International Conference on Recent Trends in Electronics, Information Communication Technology (RTEICT), 2016, pp. 1778–1781.\n",
    "](https://ieeexplore.ieee.org/document/7808140/)\n",
    "\n",
    "[L. Wan, M. Zeiler, S. Zhang, Y. L. Cun, and R. Fergus, “Regularization of Neural Networks using DropConnect,” in International Conference on Machine Learning, 2013, pp. 1058–1066.\n",
    "](http://proceedings.mlr.press/v28/wan13.html)\n",
    "\n",
    "And also these great resources and QA:\n",
    "\n",
    "[Wikipedia - Whitening transformation](https://en.wikipedia.org/wiki/Whitening_transformation)\n",
    "\n",
    "[CS231 - Convolutional Neural Networks for Visual Recognition](http://cs231n.github.io/neural-networks-2/)\n",
    "\n",
    "[Dustin Stansbury - The Clever Machine](https://theclevermachine.wordpress.com/2013/03/30/the-statistical-whitening-transform/)\n",
    "\n",
    "[Some details about the covariance matrix](http://www.visiondummy.com/2014/04/geometric-interpretation-covariance-matrix/)\n",
    "\n",
    "[SO - Image whitening in Python](https://stackoverflow.com/questions/41635737/is-this-the-correct-way-of-whitening-an-image-in-python)\n",
    "\n",
    "[Mean normalization per image or from the entire dataset](http://ufldl.stanford.edu/wiki/index.php/Data_Preprocessing)\n",
    "\n",
    "[Mean subtraction - all images or per image?](https://stackoverflow.com/questions/29743523/subtract-mean-from-image)\n",
    "\n",
    "[Why centering is important - See section 4.3](http://yann.lecun.com/exdb/publis/pdf/lecun-98b.pdf)\n",
    "\n",
    "[Kaggle kernel on ZCA](https://www.kaggle.com/nicw102168/exploring-zca-and-color-image-whitening/notebook)\n",
    "\n",
    "[How ZCA is implemented in Keras](https://github.com/keras-team/keras-preprocessing/blob/b9d142456a64ef228475f07cb2f2d38fd05bd249/keras_preprocessing/image.py#L1254:L1257)"
   ]
  }
 ],
 "metadata": {
  "hide_code_all_hidden": false,
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.2"
  },
  "toc": {
   "base_numbering": 1,
   "nav_menu": {},
   "number_sections": false,
   "sideBar": true,
   "skip_h1_title": false,
   "title_cell": "Table of Contents",
   "title_sidebar": "Contents",
   "toc_cell": false,
   "toc_position": {},
   "toc_section_display": true,
   "toc_window_display": false
  },
  "varInspector": {
   "cols": {
    "lenName": 16,
    "lenType": 16,
    "lenVar": 40
   },
   "kernels_config": {
    "python": {
     "delete_cmd_postfix": "",
     "delete_cmd_prefix": "del ",
     "library": "var_list.py",
     "varRefreshCmd": "print(var_dic_list())"
    },
    "r": {
     "delete_cmd_postfix": ") ",
     "delete_cmd_prefix": "rm(",
     "library": "var_list.r",
     "varRefreshCmd": "cat(var_dic_list()) "
    }
   },
   "types_to_exclude": [
    "module",
    "function",
    "builtin_function_or_method",
    "instance",
    "_Feature"
   ],
   "window_display": false
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
